import { _decorator } from 'cc';
import { ColorDate } from './ColorDate';
import { Tools } from './Tools';

const { ccclass } = _decorator;

/**
 * 数据模型，负责颜色管理和分组索引
 */
@ccclass('DataModel')
export class DataModel {
    /** 基础颜色数组，包含游戏内常用颜色 */
    public static base_color_arr: ColorDate[] = [
        ColorDate.new_bean(13, 105, 105, 10001),     // 深青
        ColorDate.new_bean(137, 89, 211, 10002),     // 紫色
        ColorDate.new_bean(111, 111, 111, 10003),    // 灰白
        ColorDate.new_bean(208, 191, 109, 10004),    // 黄色
        ColorDate.new_bean(211, 139, 246, 10005),    // 粉色
        ColorDate.new_bean(140, 214, 115, 10006),    // 绿色
        ColorDate.new_bean(36, 118, 200, 10007),     // 蓝色
        ColorDate.new_bean(17, 215, 215, 10008),     // 青色
        ColorDate.new_bean(239, 91, 122, 10009),     // 橘红
    ];

    /** 当前关卡使用的颜色数组（从基础颜色中复制） */
    private static lvl_color_arr: ColorDate[] = [];

    /** 当前关卡颜色索引 */
    private static lvl_color_index: number = 0;

    /** 层级颜色索引 */
    private static layer_color_index: number = 0;

    /** 当前组索引，按位计数用于分组 */
    private static cur_group_index: number = 0;

    /**
     * 根据需要的颜色数量生成当前关卡颜色数组
     * @param count 需要的颜色数量
     */
    public static generateLvlColorArr(count: number) {
        console.log("generateLvlColorArr color number:", count);
        this.lvl_color_arr = [];
        for (let i = 0; i < this.base_color_arr.length && this.lvl_color_arr.length < count; i++) {
            this.lvl_color_arr.push(this.base_color_arr[i].clone());
        }
    }

    /** 重置当前关卡颜色索引 */
    public static resetLvlColorIndex() {
        this.lvl_color_index = 0;
    }

    /**
     * 获取当前关卡颜色，自动轮回
     * 如果没有对应颜色，则随机生成一个颜色（异常处理）
     */
    public static getLvlColor(): ColorDate {
        let ret = this.lvl_color_arr[this.lvl_color_index];
        this.lvl_color_index++;
        if (this.lvl_color_index >= this.lvl_color_arr.length) {
            this.lvl_color_index = 0;
        }
        if (!ret) {
            // 线上异常，随机生成颜色防止崩溃
            const r = Tools.random_between_floor(1, 255);
            const g = Tools.random_between_floor(1, 255);
            const b = Tools.random_between_floor(1, 255);
            ret = ColorDate.new_bean(r, g, b, Tools.random_between_floor(20000, 150000));
            console.warn("getLvlColor 未找到对应颜色，随机生成", this.lvl_color_index, this.lvl_color_arr);
        }
        return ret;
    }

    /**
     * 获取基础颜色数组中的颜色，自动轮回
     */
    public static getLayerColor(): ColorDate {
        let ret = this.base_color_arr[this.layer_color_index];
        this.layer_color_index++;
        if (this.layer_color_index >= this.base_color_arr.length) {
            this.layer_color_index = 0;
        }
        return ret;
    }

    /** 打乱基础颜色数组 */
    public static shuffleBaseColors() {
        this.base_color_arr.sort(() => Math.random() - 0.5);
    }

    /**
     * 获取一个新的组索引（按位数）
     * 用于分组掩码，最多支持 31 个组（位数）
     */
    public static getNewGroupIndex(): number {
        let groupIndex = 1 << this.cur_group_index;
        this.cur_group_index++;
        if (this.cur_group_index > 30) {
            this.cur_group_index = 0;
        }
        return groupIndex;
    }
}
